package edu.northwestern.cbits.purple_robot_manager.activities.settings;
import android.annotation.TargetApi;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import java.util.HashMap;
import java.util.UUID;
import edu.northwestern.cbits.purple_robot_manager.ManagerService;
import edu.northwestern.cbits.purple_robot_manager.PurpleRobotApplication;
import edu.northwestern.cbits.purple_robot_manager.R;
import edu.northwestern.cbits.purple_robot_manager.http.LocalHttpServer;
import edu.northwestern.cbits.purple_robot_manager.logging.LogManager;
import edu.northwestern.cbits.purple_robot_manager.models.ModelManager;
import edu.northwestern.cbits.purple_robot_manager.probes.ProbeManager;
import edu.northwestern.cbits.purple_robot_manager.triggers.TriggerManager;
@TargetApi(11)
public class SettingsActivity extends AppCompatActivity
{
private static final String PREFERENCE_SCREEN_KEY = "PREFERENCE_SCREEN_KEY";
private static HashMap<String, PreferenceScreen> _screens = new HashMap<>();
public static boolean useExternalStorage(Context context)
{
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
return prefs.getBoolean("config_external_storage", false);
}
public static class SettingsPreferenceFragment extends PreferenceFragment
{
public SettingsPreferenceFragment()
{
super();
}
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
final SettingsActivity activity = (SettingsActivity) this.getActivity();
// If launched with no key, build out settings from the top...
String key = this.getArguments().getString("key");
if (key == null)
{
this.addPreferencesFromResource(R.xml.settings);
activity.setTitle(R.string.title_settings);
RobotPreferenceListener listener = new RobotPreferenceListener(activity);
PreferenceScreen prefs = this.getPreferenceScreen();
Preference refresh = prefs.findPreference(SettingsKeys.MANUAL_REFRESH_KEY);
refresh.setOnPreferenceClickListener(listener);
Preference logRefresh = prefs.findPreference(SettingsKeys.LOG_REFRESH_KEY);
logRefresh.setOnPreferenceClickListener(listener);
ListPreference haptic = (ListPreference) prefs.findPreference(SettingsKeys.HAPTIC_PATTERN_KEY);
haptic.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener()
{
@Override
public boolean onPreferenceChange(Preference preference, Object newValue)
{
String pattern = (String) newValue;
Intent intent = new Intent(ManagerService.HAPTIC_PATTERN_INTENT);
intent.putExtra(ManagerService.HAPTIC_PATTERN_NAME, pattern);
intent.setClass(activity, ManagerService.class);
activity.startService(intent);
return true;
}
});
PreferenceScreen probesScreen = ProbeManager.buildPreferenceScreen(activity, this.getPreferenceManager());
PreferenceCategory category = (PreferenceCategory) prefs.findPreference("config_settings_probe_category");
category.addPreference(probesScreen);
PreferenceScreen triggersScreen = TriggerManager.getInstance(activity).buildPreferenceScreen(activity, this.getPreferenceManager());
PreferenceCategory triggerCategory = (PreferenceCategory) prefs.findPreference("config_settings_trigger_category");
triggerCategory.addPreference(triggersScreen);
PreferenceScreen modelsScreen = ModelManager.getInstance(activity).buildPreferenceScreen(activity, this.getPreferenceManager());
PreferenceCategory modelCategory = (PreferenceCategory) prefs.findPreference("config_settings_models_category");
modelCategory.addPreference(modelsScreen);
Preference archive = prefs.findPreference(SettingsKeys.ZIP_ARCHIVES_KEY);
archive.setOnPreferenceClickListener(listener);
Preference delete = prefs.findPreference(SettingsKeys.DELETE_ARCHIVES_KEY);
delete.setOnPreferenceClickListener(listener);
Preference test = prefs.findPreference(SettingsKeys.RUN_TESTS_KEY);
test.setOnPreferenceClickListener(listener);
// CheckBoxPreference update = (CheckBoxPreference) prefs.findPreference(SettingsKeys.CHECK_UPDATES_KEY);
// update.setOnPreferenceChangeListener(listener);
ListPreference listUpdate = (ListPreference) prefs.findPreference(SettingsKeys.RINGTONE_KEY);
listUpdate.setOnPreferenceChangeListener(listener);
Preference reset = prefs.findPreference(SettingsKeys.RESET_KEY);
reset.setOnPreferenceClickListener(listener);
Preference logEnabled = prefs.findPreference(LogManager.ENABLED);
logEnabled.setOnPreferenceChangeListener(listener);
Preference logUri = prefs.findPreference(LogManager.URI);
logUri.setOnPreferenceChangeListener(listener);
Preference logLocation = prefs.findPreference(LogManager.INCLUDE_LOCATION);
logLocation.setOnPreferenceChangeListener(listener);
Preference logWifi = prefs.findPreference(LogManager.WIFI_ONLY);
logWifi.setOnPreferenceChangeListener(listener);
Preference logHeartbeat = prefs.findPreference(LogManager.HEARTBEAT);
logHeartbeat.setOnPreferenceChangeListener(listener);
Preference logInterval = prefs.findPreference(LogManager.UPLOAD_INTERVAL);
logInterval.setOnPreferenceChangeListener(listener);
Preference configUrl = prefs.findPreference(SettingsKeys.CONFIG_URL);
configUrl.setOnPreferenceChangeListener(listener);
Preference enableHttpServer = prefs.findPreference(LocalHttpServer.BUILTIN_HTTP_SERVER_ENABLED);
enableHttpServer.setOnPreferenceChangeListener(listener);
Preference enableZeroconf = prefs.findPreference(LocalHttpServer.BUILTIN_ZEROCONF_ENABLED);
enableZeroconf.setOnPreferenceChangeListener(listener);
Preference enableZeroconfName = prefs.findPreference(LocalHttpServer.BUILTIN_ZEROCONF_NAME);
enableZeroconfName.setOnPreferenceChangeListener(listener);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
{
PreferenceScreen screen = (PreferenceScreen) this.findPreference("screen_builtin_http_server");
screen.removePreference(enableZeroconf);
screen.removePreference(enableZeroconfName);
}
Preference exportBootstrap = prefs.findPreference("config_export_bootstrap");
exportBootstrap.setOnPreferenceClickListener(listener);
Preference exportJekyll = prefs.findPreference("config_export_jekyll");
exportJekyll.setOnPreferenceClickListener(listener);
Preference externalStorage = prefs.findPreference("config_external_storage");
if (ContextCompat.checkSelfPermission(activity, "android.permission.WRITE_EXTERNAL_STORAGE") != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(activity, "android.permission.READ_EXTERNAL_STORAGE") != PackageManager.PERMISSION_GRANTED)
externalStorage.setEnabled(false);
else
externalStorage.setEnabled(false);
final PreferenceFragment meFragment = this;
// Delay for half a second so preferences can be completely constructed...
Runnable r = new Runnable()
{
public void run()
{
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
}
activity.runOnUiThread(new Runnable()
{
public void run()
{
// After delay, build preference screen map...
activity.mapScreens(meFragment.getPreferenceScreen());
}
});
}
};
Thread t = new Thread(r);
t.start();
PurpleRobotApplication.fixPreferences(activity, true);
}
else
{
// If launched with a key, lookup the preference screen and go from there...
PreferenceScreen screen = SettingsActivity._screens.get(key);
this.setPreferenceScreen(screen);
activity.setTitle(SettingsActivity._screens.get(key).getTitle());
for (int i = 0; i < screen.getPreferenceCount(); i++)
{
Preference pref = screen.getPreference(i);
if (pref instanceof FlexibleListPreference)
{
FlexibleListPreference flexible = (FlexibleListPreference) pref;
flexible.setContext(activity);
}
else if (pref instanceof FlexibleEditTextPreference)
{
FlexibleEditTextPreference flexible = (FlexibleEditTextPreference) pref;
flexible.setContext(activity);
}
else if (pref instanceof PreferenceGroup)
activity.mapScreens((PreferenceGroup) pref);
}
}
}
}
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
final String key = this.getIntent().getStringExtra(SettingsActivity.PREFERENCE_SCREEN_KEY);
this.setContentView(R.layout.layout_settings_activity);
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
this.setSupportActionBar(toolbar);
this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
FragmentManager fragment = this.getFragmentManager();
FragmentTransaction transaction = fragment.beginTransaction();
SettingsPreferenceFragment prefFragment = new SettingsPreferenceFragment();
Bundle arguments = new Bundle();
arguments.putString("key", key);
prefFragment.setArguments(arguments);
transaction.replace(R.id.content_frame, prefFragment);
transaction.commit();
LogManager.getInstance(this).log("pr_settings_visited", null);
}
private void mapScreens(PreferenceGroup screen)
{
// If the screen does not have a key, generate one.
if (screen.getKey() == null)
{
String key = UUID.randomUUID().toString();
screen.setKey(key);
}
// If what we're looking at is a screen, add it to the shared map.
if (screen instanceof PreferenceScreen)
SettingsActivity._screens.put(screen.getKey(), (PreferenceScreen) screen);
// Iterate and recurse...
for (int i = 0; i < screen.getPreferenceCount(); i++)
{
Preference pref = screen.getPreference(i);
// If this is a preference group, recursively map it.
if (pref instanceof PreferenceGroup)
this.mapScreens((PreferenceGroup) pref);
if (pref instanceof PreferenceScreen)
{
// Add activity intent to launch new SettingActivity instances to override
// dialog-based behavior.
Intent intent = new Intent(this, SettingsActivity.class);
intent.putExtra(SettingsActivity.PREFERENCE_SCREEN_KEY, pref.getKey());
pref.setIntent(intent);
}
}
}
protected void onDestroy()
{
super.onDestroy();
LogManager.getInstance(this).log("pr_settings_exited", null);
}
public boolean onOptionsItemSelected(MenuItem item)
{
if (item.getItemId() == android.R.id.home)
{
this.finish();
}
return true;
}
}